package org.example.myleet.segmenttree;

public interface SegmentTree {

    /**
     * 更新l到r范围内的值，时间复杂度O(log(n))
     * @param l 范围左端点
     * @param r 范围右端点
     * @param v 更新的值
     * @param segment 递归时使用的线段
     */
    void modify(int l, int r, int v, Segment segment);

    /**
     * 查询l到r范围内最大值，时间复杂度O(log(n))
     * @param l 范围左端点
     * @param r 范围右端点
     * @param segment 递归时使用的线段
     * @return l到r范围内最大值
     */
    int query(int l, int r, Segment segment);

    /**
     * 劈开线段，为线段创造左节点和右节点
     * @param segment 需要劈开的线段
     */
    void pushDown(Segment segment);

    /**
     * 基于左右子节点更新线段范围的值
     * @param segment 需要更新值的线段范围
     */
    void pushUp(Segment segment);
}
